package org.example.controller.jd;

import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.springframework.stereotype.Component;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Request;
import us.codecraft.webmagic.Task;
import us.codecraft.webmagic.downloader.Downloader;
import us.codecraft.webmagic.selector.PlainText;

import java.util.List;

//@Component
public class JdDownloader implements Downloader {
    private RemoteWebDriver driver;

    //   构造方法中初始化无头浏览器
    public JdDownloader() {
        //创建配置信息
        System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe");
        ChromeOptions chromeOptions = new ChromeOptions();
//        所在headless模式（必须）  无头模式
//        chromeOptions.addArguments("--headless");
//        设置浏览器窗口的大小（非必填）
        chromeOptions.addArguments("--window-size=1366,700");
//        4.基于配置对象创建RemoteWebDriver对象
        driver = new ChromeDriver(chromeOptions);
    }

    @Override
    public Page download(Request request, Task task) {
        try {
            //        下载页面的业务逻辑
//        从request对象中取要访问的url
            String url = request.getUrl();
//      判断是否是翻页处理
            if (!"http://nextpage.com".equals(url)) {
//            1、抓取页面
                driver.get(url);
//               访问url
                List<WebElement> list = driver.findElementsByCssSelector("li.gl-item");
//          页面滚到最下方  判断是否是列表页面
                if (list.size() > 0) {
                    //        页面滚动到下方
                    driver.executeScript("window.scrollTo(0,document.body.scrollHeight -300)");
                    Thread.sleep(2000);
                    //          从浏览器中取html
                    String html = driver.getPageSource();
//        需要把结果封装为Page对象
                    Page page = createPage(html, driver.getCurrentUrl());
                    return page;
                }
                //        2.如果是详情页面
                String html = driver.getPageSource();
                return createPage(html, driver.getCurrentUrl());
//        直接访问url
//        取html,封装成page对象 返回。
            } else {
//        3.如果是翻页处理

//        从Request对象中取附件，要翻页之前的url.
                String curUrl = (String) request.getExtra("url");
//        访问url
                driver.get(curUrl);
//        点解翻页按钮，翻到第二页
                driver.findElementByCssSelector("").click();
                Thread.sleep(2000);
//        让页面滚动到下方，加载后30条数据
                driver.executeScript("window.scrollTo(0,document.body.scrollHeight -300)");
                Thread.sleep(2000);
//            取浏览器渲染的html
                String html = driver.getPageSource();
//        封装成page对象
                return createPage(html, driver.getCurrentUrl());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    public void setThread(int threadNum) {

    }

    //将html封装成Page对象
    private Page createPage(String html, String url) {
        Page page = new Page();
        page.setRawText(html);
        page.setUrl(new PlainText(url));
//        设置一个request对象
        page.setRequest(new Request(url));
//        设置抓取成功的标志
        page.setDownloadSuccess(true);
        return page;

    }
}
